// 在Dart编程语言中，?? 是一个空值合并运算符（Nil Coalescing Operator）。它的作用是：当左侧的操作数为 null 时，它会返回右侧的操作数；否则，它会返回左侧操作数的原始值。这个运算符特别适用于为可能为 null 的变量设置默认值。
void main(List<String> args) {
  // ??=  当原来的变量有值时候，那么??=不执行
  // 变量 name 已经被初始化为 "dart"，这意味着它不是 null。因此，name ??= "java"; 这行代码实际上不会执行任何操作，name 的值仍然保持为 "dart"。
  // var name = "dart";
  // 原来的变量是null,那么将值赋值给这个变量
  var name = null;
  name ??= "java";
  print(name);

  // ??
  // 在iOS的Swift编程语言中,也存在??这个运算符
  // ??前面的数据有值，那么就使用??前面的数据
  // ??前面的数据是null，那么就使用后面的数据
  // var name2 = "JavaScript";
  var name2 = null;
  var temp = name2 ?? "TypeScript";
  print(temp);

  // 在这个例子中，name 的初始值为 null。因此，name ?? 'Guest' 的结果是 'Guest'，并被赋值给 message 变量。如果 name 有一个非 null 的值，那么该值就会被使用，而不是 'Guest'。
  var name3 = null;
  var message = name3 ?? 'Guest';
  print(message); // 输出: Guest

  // Dart中还有一个类似的运算符 ??=，它是一个空值合并赋值运算符。这个运算符会检查左侧的变量是否为 null，如果是，则将其赋值为右侧的表达式；否则，它不会改变左侧变量的值。
  var name4 = null;
  name4 ??= 'Guest';
  print(name4); // 输出: Guest

  name4 = 'Alice';
  name4 ??= 'Bob';
  print(name4); // 输出: Alice
  // 在第一个 name ??= 'Guest' 中，因为 name 是 null，所以它会被赋值为 'Guest'。在第二个 name ??= 'Bob' 中，因为 name 已经有一个非 null 的值 'Alice'，所以它不会被改变。
  // 总之，?? 和 ??= 这两个运算符为Dart中的空值处理提供了一种简洁而强大的方式。
}
